import { IPSModelObject } from '../../ipsmodel-object';
import { IPSDEAction } from '../action/ipsdeaction';
import { IPSDEDataSet } from '../ds/ipsdedata-set';
import { IPSDEServiceAPIMethodInput } from './ipsdeservice-apimethod-input';
import { IPSDEServiceAPIMethodReturn } from './ipsdeservice-apimethod-return';
import { IPSSysSFPlugin } from '../../res/ipssys-sfplugin';
import { IPSSubSysServiceAPIDEMethod } from '../../service/ipssub-sys-service-apidemethod';

/**
 *
 * 子接口类型识别属性[]
 * @export
 * @interface IPSDEServiceAPIMethod
 */
export interface IPSDEServiceAPIMethod extends IPSModelObject {
  /**
   * 代码标识
   * @type {string}
   */
  codeName: string;

  /**
   * 代码名称2
   * @type {string}
   */
  codeName2: string;

  /**
   * 数据访问标识
   * @type {string}
   */
  dataAccessAction: string;

  /**
   * 方法参数
   * @type {string}
   */
  methodParam: string;

  /**
   * 方法参数2
   * @type {string}
   */
  methodParam2: string;

  /**
   * 方法类型
   * @description 值模式 [实体服务接口成员类型] {DEACTION：实体行为、 FETCH：实体数据集合、 SELECT：实体数据查询（SELECT）、 FETCHTEMP：实体数据集合（临时）、 SELECTTEMP：实体数据查询（SELECT）（临时）、 USER：用户自定义、 USER2：用户自定义2、 USER3：用户自定义3、 USER4：用户自定义4 }
   * @type {( string | 'DEACTION' | 'FETCH' | 'SELECT' | 'FETCHTEMP' | 'SELECTTEMP' | 'USER' | 'USER2' | 'USER3' | 'USER4')}
   */
  methodType: string | 'DEACTION' | 'FETCH' | 'SELECT' | 'FETCHTEMP' | 'SELECTTEMP' | 'USER' | 'USER2' | 'USER3' | 'USER4';

  /**
   * 实体行为
   *
   * @type {IPSDEAction}
   */
  getPSDEAction(): IPSDEAction | null;

  /**
   * 实体行为
   *
   * @type {IPSDEAction}
   */
  get psDEAction(): IPSDEAction | null;

  /**
   * 实体行为（必须存在）
   *
   * @type {IPSDEAction}
   */
  getPSDEActionMust(): IPSDEAction;

  /**
   * 数据集合
   *
   * @type {IPSDEDataSet}
   */
  getPSDEDataSet(): IPSDEDataSet | null;

  /**
   * 数据集合
   *
   * @type {IPSDEDataSet}
   */
  get psDEDataSet(): IPSDEDataSet | null;

  /**
   * 数据集合（必须存在）
   *
   * @type {IPSDEDataSet}
   */
  getPSDEDataSetMust(): IPSDEDataSet;

  /**
   * 方法输入对象
   *
   * @type {IPSDEServiceAPIMethodInput}
   */
  getPSDEServiceAPIMethodInput(): IPSDEServiceAPIMethodInput | null;

  /**
   * 方法输入对象
   *
   * @type {IPSDEServiceAPIMethodInput}
   */
  get psDEServiceAPIMethodInput(): IPSDEServiceAPIMethodInput | null;

  /**
   * 方法输入对象（必须存在）
   *
   * @type {IPSDEServiceAPIMethodInput}
   */
  getPSDEServiceAPIMethodInputMust(): IPSDEServiceAPIMethodInput;

  /**
   * 方法返回对象
   *
   * @type {IPSDEServiceAPIMethodReturn}
   */
  getPSDEServiceAPIMethodReturn(): IPSDEServiceAPIMethodReturn | null;

  /**
   * 方法返回对象
   *
   * @type {IPSDEServiceAPIMethodReturn}
   */
  get psDEServiceAPIMethodReturn(): IPSDEServiceAPIMethodReturn | null;

  /**
   * 方法返回对象（必须存在）
   *
   * @type {IPSDEServiceAPIMethodReturn}
   */
  getPSDEServiceAPIMethodReturnMust(): IPSDEServiceAPIMethodReturn;

  /**
   * 重定向外部服务接口实体方法
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  getPSSubSysServiceAPIDEMethod(): IPSSubSysServiceAPIDEMethod | null;

  /**
   * 重定向外部服务接口实体方法
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  get psSubSysServiceAPIDEMethod(): IPSSubSysServiceAPIDEMethod | null;

  /**
   * 重定向外部服务接口实体方法（必须存在）
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  getPSSubSysServiceAPIDEMethodMust(): IPSSubSysServiceAPIDEMethod;

  /**
   * 后端扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后端扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  get psSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后端扩展插件（必须存在）
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPluginMust(): IPSSysSFPlugin;

  /**
   * 父值处理模式
   * @description 值模式 [传入父值处理模式] {DEFAULT：默认、 CHILDOF：递归子数据（查询）、 IGNORE：忽略、 USER：用户自定义、 USER2：用户自定义2、 USER3：用户自定义3、 USER4：用户自定义4 }
   * @type {( string | 'DEFAULT' | 'CHILDOF' | 'IGNORE' | 'USER' | 'USER2' | 'USER3' | 'USER4')}
   * @default DEFAULT
   */
  parentKeyMode: string | 'DEFAULT' | 'CHILDOF' | 'IGNORE' | 'USER' | 'USER2' | 'USER3' | 'USER4';

  /**
   * 请求属性
   * @type {string}
   */
  requestField: string;

  /**
   * 请求方式
   * @description 值模式 [REST请求方式] {GET：GET、 HEAD：HEAD、 POST：POST、 PUT：PUT、 PATCH：PATCH、 DELETE：DELETE、 OPTIONS：OPTIONS、 TRACE：TRACE }
   * @type {( string | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'TRACE')}
   */
  requestMethod: string | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'TRACE';

  /**
   * 参数类型
   * @description 值模式 [服务请求参数类型] {NONE：无参数、 FIELD：指定属性、 FIELDS：指定属性数组、 ENTITY：数据对象、 ENTITIES：数据对象数组、 OBJECT：其它对象、 OBJECTS：其它对象数组 }
   * @type {( string | 'NONE' | 'FIELD' | 'FIELDS' | 'ENTITY' | 'ENTITIES' | 'OBJECT' | 'OBJECTS')}
   */
  requestParamType: string | 'NONE' | 'FIELD' | 'FIELDS' | 'ENTITY' | 'ENTITIES' | 'OBJECT' | 'OBJECTS';

  /**
   * 请求路径
   * @type {string}
   */
  requestPath: string;

  /**
   * 返回值类型
   * @description 值模式 [实体行为返回值类型] {VOID：无（void）、 SIMPLE：简单值、 SIMPLES：简单值数组、 ENTITY：数据对象（Entity）、 ENTITIES：数据对象数组（Entity[]）、 OBJECT：其它对象（Object）、 OBJECTS：其它对象数组（Object[]）、 LINKENTITY：外部数据对象（Entity）、 LINKENTITIES：外部数据对象数组（Entity[]）、 ASYNCACTION：异步操作对象、 SSE：服务器端事件对象（SSE）、 USER：用户自定义（USER）、 USER2：用户自定义2（USER2） }
   * @type {( string | 'VOID' | 'SIMPLE' | 'SIMPLES' | 'ENTITY' | 'ENTITIES' | 'OBJECT' | 'OBJECTS' | 'LINKENTITY' | 'LINKENTITIES' | 'ASYNCACTION' | 'SSE' | 'USER' | 'USER2')}
   */
  returnValueType: string | 'VOID' | 'SIMPLE' | 'SIMPLES' | 'ENTITY' | 'ENTITIES' | 'OBJECT' | 'OBJECTS' | 'LINKENTITY' | 'LINKENTITIES' | 'ASYNCACTION' | 'SSE' | 'USER' | 'USER2';

  /**
   * 临时数据模式
   * @description 值模式 [平台部件处理器临时数据模式] {0：无临时数据模式、 1：主数据模式、 2：从数据模式 }
   * @type {( number | 0 | 1 | 2)}
   */
  tempDataMode: number | 0 | 1 | 2;

  /**
   * 启用判断执行方法
   * @type {boolean}
   */
  enableTestMethod: boolean;

  /**
   * 需要提供资源键值
   * @type {boolean}
   * @default false
   */
  needResourceKey: boolean;

  /**
   * 无服务代码标识
   * @type {boolean}
   * @default false
   */
  noServiceCodeName: boolean;
}
